package main

import (
	_ "github.com/go-sql-driver/mysql"
	"xorm.io/xorm"
)

//创建 Engine 组 : https://xorm.io/zh/docs/chapter-01/2.engine_group/
//通过创建引擎组 EngineGroup 来实现对从数据库 (Master/Slave) 读写分离的支持。在创建引擎章节中，
//我们已经介绍过了，在 xorm 里面，可以同时存在多个 Orm 引擎，一个 Orm 引擎称为 Engine，
//一个 Engine 一般只对应一个数据库，而 EngineGroup 一般则对应一组数据库。
//EngineGroup 通过调用 xorm.NewEngineGroup 生成，

func main() {
	enginGroup01()
	//enginGroup02()
}

// enginGroup01
//
//	@Description: 引擎组
func enginGroup01() {
	var eg *xorm.EngineGroup
	conns := []string{
		"root:root123@tcp(127.0.0.1:3306)/xorm1?charset=utf8mb4&parseTime=True&loc=Local", // 第一个默认是master
		"root:root123@tcp(127.0.0.1:3306)/xorm2?charset=utf8mb4&parseTime=True&loc=Local", // 第二个开始都是slave
		"root:root123@tcp(127.0.0.1:3306)/xorm3?charset=utf8mb4&parseTime=True&loc=Local",
	}

	var err error
	eg, err = xorm.NewEngineGroup("mysql", conns)

	if err != nil {
		panic(err)
	}
	defer eg.Close()
	err = eg.Ping()
	if err != nil {
		panic(err)
	}

}

// enginGroup02
//
//	@Description: 引擎组
func enginGroup02() {
	var eg *xorm.EngineGroup

	var err error
	master, err := xorm.NewEngine("mysql", "root:root123@tcp(127.0.0.1:3306)/xorm1?charset=utf8mb4&parseTime=True&loc=Local")
	if err != nil {
		return
	}

	slave1, err := xorm.NewEngine("mysql", "root:root123@tcp(127.0.0.1:3306)/xorm2?charset=utf8mb4&parseTime=True&loc=Local")
	if err != nil {
		return
	}

	slave2, err := xorm.NewEngine("mysql", "root:root123@tcp(127.0.0.1:3306)/xorm3?charset=utf8mb4&parseTime=True&loc=Local")
	if err != nil {
		return
	}

	slaves := []*xorm.Engine{slave1, slave2}
	eg, err = xorm.NewEngineGroup(master, slaves)
	err = eg.Ping()
	if err != nil {
		panic(err)
	}
	//返回Master数据库引擎
	//engineMaster := eg.Master()

	//依据给定的负载策略返回一个Slave数据库引擎
	//slave := eg.Slave()

	defer eg.Close()
}
